package bossZone

import (
	"encoding/json"
	table_BossZone "sanguo/node/table/excel/table/BossZone"
	cs_message "sanguo/protocol/cs/message"

	"github.com/golang/protobuf/proto"
)

type BossZone struct {
	BossZoneID int32
	IsThrough  bool
}

type RoleBossZone struct {
	bossZones     map[int32]*BossZone
	currentEnter  *EnterBossZone
	bossZoneDirty map[int32]bool
	dbDirty       bool
}

type EnterBossZone struct {
	BossZoneID    int32
	BattleLevelID int32
}

func newBossZone(bossZoneID int32) *BossZone {
	return &BossZone{
		BossZoneID: bossZoneID,
		IsThrough:  false,
	}
}

func (this *RoleBossZone) GetBossZone(bossZoneID int32) *BossZone {
	return this.bossZones[bossZoneID]
}

func (this *RoleBossZone) AddBossZone(bossZoneID int32) {
	if this.bossZones[bossZoneID] == nil {
		bossZone := &BossZone{
			BossZoneID: bossZoneID,
			IsThrough:  false,
		}
		this.bossZones[bossZoneID] = bossZone
		this.bossZoneDirty[bossZoneID] = true
	}
	this.SetDirtyFlag()
}

func (this *RoleBossZone) GetCurrentEnter() *EnterBossZone {
	return this.currentEnter
}

func (this *RoleBossZone) EndBossZone(b bool) bool {
	if this.currentEnter == nil {
		return false
	}

	if b {
		bossZoneID := this.currentEnter.BossZoneID
		bossZone := this.bossZones[bossZoneID]
		if !bossZone.IsThrough {
			bossZone.IsThrough = true
			this.bossZoneDirty[bossZoneID] = true

			newBossZoneID := bossZoneID + 1
			BossZoneDef := table_BossZone.Table_.IDMap[newBossZoneID]
			if BossZoneDef != nil {
				this.bossZones[newBossZoneID] = newBossZone(newBossZoneID)
				this.bossZoneDirty[newBossZoneID] = true
			}
			this.SetDirtyFlag()
		}
	}

	this.currentEnter = nil
	return true
}

func (this *RoleBossZone) InitCurrentEnter(bossZoneID int32) {
	BossZoneDef := table_BossZone.Table_.IDMap[bossZoneID]
	this.currentEnter = &EnterBossZone{
		BossZoneID:    bossZoneID,
		BattleLevelID: BossZoneDef.BattleLevel,
	}
}

//打包
func (this *RoleBossZone) PackAllBossZone() []*cs_message.BossZone {
	ret := []*cs_message.BossZone{}
	for _, v := range this.bossZones {
		bossZone := &cs_message.BossZone{
			BossZoneID: proto.Int32(v.BossZoneID),
			IsThrough:  proto.Bool(v.IsThrough),
		}
		ret = append(ret, bossZone)
	}
	return ret
}

func (this *RoleBossZone) GetBossZoneDirtyLength() int {
	return len(this.bossZoneDirty)
}

func (this *RoleBossZone) PackBossZoneModify() []*cs_message.BossZone {

	ret := []*cs_message.BossZone{}
	for id, b := range this.bossZoneDirty {
		if b {
			delete(this.bossZoneDirty, id)
			v := this.bossZones[id]

			bossZone := &cs_message.BossZone{
				BossZoneID: proto.Int32(v.BossZoneID),
				IsThrough:  proto.Bool(v.IsThrough),
			}
			ret = append(ret, bossZone)

		}
	}

	return ret
}

func (this *RoleBossZone) PackJson(fields map[string]interface{}) {
	if this.dbDirty {
		jsonStr, err := json.Marshal(this.bossZones)
		if nil == err {
			fields["bossZone"] = jsonStr
		}
	}
}

func (this *RoleBossZone) IsDirty() bool {
	return this.dbDirty
}

func (this *RoleBossZone) SetDirtyFlag() {
	this.dbDirty = true
}

func (this *RoleBossZone) ClearDirtyFlag() {
	this.dbDirty = false
}

func (this *RoleBossZone) Init(bossZones map[int32]*BossZone) {
	this.bossZones = bossZones
	this.bossZoneDirty = map[int32]bool{}
	this.dbDirty = false
}
